package com.wmx.config;

import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.stereotype.Component;
import sun.misc.BASE64Encoder;

import java.lang.reflect.Method;
import java.security.MessageDigest;

/**
 * Spring cache 自定义 Spring 缓存Key的生成策略 - 对参数求 md5 值作为 key
 *
 * @author wangMaoXiong
 * @version 1.0
 * @date 2023/6/17 20:17
 */
@Component
public class Md5KeyGenerator implements KeyGenerator {

    /**
     * 为给定的方法及其参数生成缓存的 key。
     *
     * @param target ：目标实例对象，如 XxxImpl
     * @param method ：被调用的方法
     * @param params ：被调用方法的参数
     * @return 返回生成好的 key ：如 findOne#z9rcAzfhvHuD7qZY3Ln82g==
     */
    @Override
    public Object generate(Object target, Method method, Object... params) {
        //指定信息摘要算法提取摘要的哈希值. 哈希值字节数组，如果直接 new String(md5Byte) 是会乱码的
        StringBuffer stringBuffer = new StringBuffer();
        try {
            for (Object obj : params) {
                stringBuffer.append(obj.toString()).append("#");
            }
            MessageDigest messageDigest = MessageDigest.getInstance("md5");
            byte[] md5Byte = messageDigest.digest(stringBuffer.toString().getBytes());
            String key = method.getName() + "#" + new BASE64Encoder().encode(md5Byte);
            return key;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return params;
    }
}
